import Modal from 'ant-design-vue/es/modal'
export default (Vue) => {
	function dialog(component, componentProps, modalProps) {
		const _vm = this
		modalProps = modalProps || {}
		if (!_vm || !_vm._isVue) {
			return
		}
		let dialogDiv = document.querySelector('body>div[type=dialog]')
		if (!dialogDiv) {
			dialogDiv = document.createElement('div')
			dialogDiv.setAttribute('type', 'dialog')
			document.body.appendChild(dialogDiv)
		}

		const handle = function (checkFunction, afterHandel) {
			if (checkFunction instanceof Function) {
				const res = checkFunction()
				if (res instanceof Promise) {
					res.then(c => {
						c && afterHandel()
					})
				} else {
					res && afterHandel()
				}
			} else {
				// checkFunction && afterHandel()
				checkFunction || afterHandel()
			}
		}

		const dialogInstance = new Vue({
			data() {
				return {
					visible: true
				}
			},
			router: _vm.$router,
			store: _vm.$store,
			mounted() {
				this.$on('close', (v) => {
					this.handleClose()
				})
			},
			methods: {
				handleClose() {
					handle(this.$refs._component.onCancel, () => {
						this.visible = false
						this.$refs._component.$emit('close')
						this.$refs._component.$emit('cancel')
						dialogInstance.$destroy()
					})
				},
				handleOk() {
					handle(this.$refs._component.onOK || this.$refs._component.onOk, () => {
						this.visible = false
						this.$refs._component.$emit('close')
						this.$refs._component.$emit('ok')
						dialogInstance.$destroy()
					})
				}
			},
			render: function (h) {
				const that = this
				const modalModel = modalProps && modalProps.model
				if (modalModel) {
					delete modalProps.model
				}
				const ModalProps = Object.assign({}, modalModel && { model: modalModel } || {}, {
					attrs: Object.assign({}, {
						...(modalProps.attrs || modalProps)
					}, {
						visible: this.visible
					}),
					on: Object.assign({}, {
						...(modalProps.on || modalProps)
					}, {
						ok: () => {
							that.handleOk()
						},
						cancel: () => {
							that.handleClose()
						}
					})
				})

				const componentModel = componentProps && componentProps.model
				if (componentModel) {
					delete componentProps.model
				}
				const ComponentProps = Object.assign({}, componentModel && { model: componentModel } || {}, {
					ref: '_component',
					attrs: Object.assign({}, {
						...((componentProps && componentProps.attrs) || componentProps)
					}),
					on: Object.assign({}, {
						...((componentProps && componentProps.on) || componentProps)
					})
				})

				return h(Modal, ModalProps, [h(component, ComponentProps)])
			}
		}).$mount(dialogDiv)
	}

	Object.defineProperty(Vue.prototype, '$dialog', {
		get: () => {
			return function () {
				dialog.apply(this, arguments)
			}
		}
	})
}
